package chap_02_CAS.step_01_Atomic_Base;

import java.util.concurrent.atomic.AtomicStampedReference;

/**
 * @Description AtomicStampedReference 使用学习
 * @Author shihan
 * @Date 2022/10/29 17:38
 * @Version 1.0
 */
public class Atomic_03_StampedReference {

    /**
     * 注意：AtomicStampedReference对象类型，比较的是对象的地址指针，而不是对象内的属性数据，并且多了一个版本号，用来解决ABA问题
     *
     * @param args
     */
    public static void main(String[] args) {
        User z3 = new User("z3", 23);
        User l4 = new User("l4", 24);

        // 原始值是 z3，版本号是 1
        AtomicStampedReference<User> reference = new AtomicStampedReference<>(z3, 1);
        System.out.println(reference.getReference().toString() + "\t" + reference.getStamp());

        // 判断当前对象是 z3，并且版本号是 1 --> 才更新为 l4，版本号为 2
        boolean b;
        b = reference.compareAndSet(z3, l4, reference.getStamp(), reference.getStamp() + 1);
        System.out.println(b + "\t" + reference.getReference().toString() + "\t" + reference.getStamp());

        // 判断当前对象 l4，版本号为 2 --> 才更新为 z3，并且版本号是 3
        b = reference.compareAndSet(l4, z3, reference.getStamp(), reference.getStamp() + 1);
        System.out.println(b + "\t" + reference.getReference().toString() + "\t" + reference.getStamp());

    }

}

